package routing

import "sync"

//Node 节点实体
type Node struct {
	NodeName string `json:"nodename"`
	Address  string `json:"address"`
	Weight   int    `json:"weight"`
	Stat     bool   `json:"stat"`
	stattime int64  `json:"stattime"`
}

//SameNode 相似节点路由表
type SameNode struct {
	RoutingAddr sync.Map
}

//NewSameNode ..创建一个新的相似节点集
func NewSameNode() *SameNode {
	return &SameNode{
		RoutingAddr: sync.Map{},
	}
}

//AddrOrUpdateNode ..无则创建，有则添加
func (s *SameNode) AddrOrUpdateNode(node *Node) {
	if node != nil {
		s.RoutingAddr.Store(node.Address, node)
	}
}

//DeleteNode ..删除节点
func (s *SameNode) DeleteNode(addr string) {
	if len(addr) > 5 {
		s.RoutingAddr.Delete(addr)
	}
}

//GetAllNode ..获取所有节点
func (s *SameNode) GetAllNode() (list []Node) {
	list = make([]Node, 0)
	s.RoutingAddr.Range(func(key, value interface{}) bool {
		list = append(list, *value.(*Node))
		return true
	})
	return
}

//ErgodicAllNode ..便利节点地址
func (s *SameNode) ErgodicAllNode(f ErgodicAllNode_func) {
	s.RoutingAddr.Range(func(_, value interface{}) bool {
		f(value.(*Node))
		return true
	})
}
